package me.unclepi;

public class VariableTest {
    public static void main() {
        int a = 1, b, c = 2;
        double pi = 3.14159;
        char x = 'x';
        System.out.println(a);

        // 数据类型
        /*
        byte  8位，有符号（signed）整数
        min: -128(-2^7)
        max: 127(2^7-1)
        默认值： 0
         */
        byte foo = 100;
        byte bar = -50;


        /*
        short 16位，signed整数
        min: -32768(-2^15)
        max: 32767(2^15-1)
        default: 0
         */
        short number1 = 100;
        short number2 = -20000;

        /*
        int 32位，signed整数
        min: -2,147,483,648(-2^31)
        max: 2,147,483,647(2^31 -e 1)
        default: 0
        整型变量默认为int类型
         */
        int number3 = 50000;
        int nubmer4 = -323322332;

        /*
        long 64位，signed整数
        min: -2^63
        max: 2^63 - 1
        default: 0L
         */
        long number5 = 5555555L;
        long number6 = -2222222L;

        /*
        float 单精度，32位浮点数
        float在存储大型浮点数组时可以节省内存空间
        default: 0.0f
         */
        float f1 = 123.11f;
        float f2 = 456.f; // 后缀必须加f或F
        System.out.println(f1);

        /*
        double 双精度，64位浮点数
        浮点数的默认类型为 double
        default: 0.0d
         */
        double d1 = 333.33d;
        double d2 = 333.33; // 默认是double
        System.out.println(d1);

        /*
        boolean 一位
        只有两个取值： true 和 false
        default: false
         */
        boolean flag = true;
        boolean active = false;

        /*
        char 16位Unicode字符
        min: '\u0000', 即为0
        max: '\uffff', 即为65,535(2^16)
        default: '\u0000', 即为0
        char可以存储任何字符
         */
        char letter = 'A';


        /*
        byte short int long 都可以用十进制、二进制、八进制、十六进制的方式表示。
        前缀：
        0b 二进制
        0 八进制
        0x 十六进制
         */
        int decimal = 174;
        int binary = 0b10101110;
        int octal = 0256;
        int hexa = 0xAE;
        System.out.println(decimal);
        System.out.println(binary);
        System.out.println(octal);
        System.out.println(hexa);

        /*
        类型转换
        占用内存少的类型可以自动转换为占用空间大的类型，反之不成立
        基本转换关系如下：
        byte(1B) --> short(2B) --> int(4B) --> long(8B) --> float(4B) --> double(8B)
        整型可以自动转换浮点型，反之不行
         */
        int int_a = 12;
        long long_a = 13L;
        float float_a = 11f;
        double double_a = 14d;

        // error: int_a = float_a
        float_a = int_a;  // int 可以自动转成float
        System.out.println(float_a);
        // error: int_a = long_a
        long_a = int_a;
        // error long_a = float_a
        float_a = long_a;
        // error: float_a = double_a
        double_a = float_a;
        System.out.println(double_a);

        /*
        如果非要把long型转成int，则需要进行强制类型转换
        如果long型变量过大，可能会导致错误
         */
        int int_b = 11;
        long long_b = 12;
        char char_b = '1';
        float float_b = 1.1f;
        int_b = (int)long_b;
        System.out.println(int_b);
        int_b = (int)char_b;
        System.out.println((int_b));
        int_b = (int)float_b;
        System.out.println(int_b);
    }
}
